home *** CD-ROM | disk | FTP | other *** search
- /* TrackScroll.c */
- /*
- * Copyright © 1989 Martin Minow. All rights reserved.
- *
- * void
- * TrackScroll(horiz, vert, track_handle)
- * LONGINT horiz;
- * LONGINT vert;
- * TrackHandle track_handle;
- *
- * Scroll the TrackRecord text. Both values are in
- * pixels.
- *
- * void
- * TrackPinScroll(horiz, vert, track_handle)
- * LONGINT horiz;
- * LONGINT vert;
- * TrackHandle track_handle;
- *
- * Like TrackScroll, but stop scrolling when the last line
- * is visible.
- */
-
- #include "TrackEdit.h"
- #define TR (*tr)
- #define abs(x) ((x) < 0 ? (-(x)) : (x))
- #define height(r) ((r).bottom - (r).top)
- #define width(r) ((r).right - (r).left)
- #define pin(delta, current, max) ( \
- (delta < 0) ? ((current <= 0) ? 0 : delta) \
- : ((current >= max) ? 0 : delta) \
- )
-
- void
- TrackScroll(hscroll, vscroll, track_handle)
- LONGINT hscroll;
- LONGINT vscroll;
- TrackHandle track_handle;
- {
- register TrackPtr tr;
- _Track_state state;
-
- tr = _Track_lock(track_handle, &state);
- _Track_do_scroll(tr, hscroll, vscroll);
- _Track_unlock(&state);
- }
-
- void
- TrackPinScroll(hscroll, vscroll, track_handle)
- LONGINT hscroll;
- LONGINT vscroll;
- TrackHandle track_handle;
- {
- register TrackPtr tr;
- _Track_state state;
- LONGINT hmax, vmax;
-
- tr = _Track_lock(track_handle, &state);
- hmax = TR.lineWidth - width(TR.viewRect);
- vmax = (TR.nLines * TR.lineHeight)
- + TR.fontDescent
- - height(TR.viewRect);
- vscroll = pin(vscroll, TR.topPixel, vmax);
- if (TR.crOnly >= 0)
- hscroll = pin(hscroll, TR.leftPixel, hmax);
- else if (hscroll < 0 && TR.leftPixel <= 0)
- hscroll = 0;
- _Track_do_scroll(tr, hscroll, vscroll);
- _Track_unlock(&state);
- }
-
- void
- _Track_do_scroll(tr, hscroll, vscroll)
- register TrackPtr tr;
- LONGINT hscroll;
- LONGINT vscroll;
- {
- RgnHandle old_clip;
- RgnHandle scroll_region;
- Rect scroll_rect;
-
- /*
- * Save the old clip region so we can be called
- * multiple times between update events. This
- * is needed for autoscrolling.
- */
- old_clip = NewRgn();
- GetClip(old_clip);
- scroll_region = NewRgn();
- TR.topPixel += vscroll;
- TR.leftPixel += hscroll;
- if (abs(vscroll) > height(TR.viewRect)
- || abs(hscroll) > width(TR.viewRect)) {
- EraseRect(&TR.viewRect);
- scroll_rect = TR.viewRect;
- RectRgn(scroll_region, &scroll_rect);
- }
- else {
- ScrollRect(
- &TR.viewRect,
- (INTEGER) -hscroll,
- (INTEGER) -vscroll,
- scroll_region
- );
- scroll_rect = (*scroll_region)->rgnBBox;
- SetClip(scroll_region);
- }
- _Track_do_update(tr, &scroll_rect);
- ValidRgn(scroll_region);
- DisposeRgn(scroll_region);
- SetClip(old_clip);
- DisposeRgn(old_clip);
- }
-